const { DataTypes, Sequelize } = require("sequelize");
const sequelize = require("./sequelizeBaseConfig.js");

/* ORM（对象关系映射）库，定义了一个名为 UserAuth 的模型（Model）。这个模型用于与数据库中的 user_auth 表进行交互。
define函数第一个参数是模型的名称，第二个参数是一个对象，定义了模型的各个字段以及它们的数据类型、约束条件等。
第三个参数是一个配置对象，用于指定模型的一些设置，比如表名和是否启用时间戳字段。

注意：默认会设置一个主键id出现在查询语句中，重新设置主键则不会默认添加
查询的时候会将设置的表名重名为define的第一个参数

*/
// 用户账户信息
const UserAuth = sequelize.define(
  "UserAuth",
  {
    id: {
      type: DataTypes.BIGINT,
      comment: "ID",
      autoIncrement: true, //自增
      primaryKey: true, //主键
    },
    created_at: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: "创建时间",
      defaultValue: new Date().toLocaleString(), //如果没有设置该字段的值则使用默认
    },
    updated_at: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: "更新时间",
      defaultValue: new Date().toLocaleString(),
    },
    user_info_id: {
      type: DataTypes.BIGINT,
      allowNull: false,
      comment: "用户信息ID",
    },
    username: {
      type: DataTypes.STRING(50), //指定长度50的字符串
      allowNull: false,
      comment: "用户名--即注册的邮箱名",
    },
    password: {
      type: DataTypes.STRING(100),
      allowNull: false,
      comment: "密码",
    },
    login_type: {
      type: DataTypes.TINYINT, //小整数（TINYINT）类型字段
      allowNull: true,
      comment: "登录类型",
      defaultValue: 1,
    },
    ip_address: {
      type: DataTypes.STRING(20),
      allowNull: true,
      comment: "登录IP地址",
    },
    ip_source: {
      type: DataTypes.STRING(50),
      allowNull: true,
      comment: "IP来源",
    },
    last_login_time: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: "上次登录时间",
      defaultValue: new Date().toLocaleString(),
    },
  },
  {
    tableName: "user_auth", // 请替换为实际的表名
    // createdAt: "created_at", // 指定创建时间字段名 这样子写也行，但是不能配置
    // updatedAt: "updated_at", // 指定更新时间字段名
    //如果手动配置了下面的就设置为false，因为会将默认提供的字段也添加进去
    timestamps: false, // 如果表中没有 createdAt 和 updatedAt 字段,设置为false，但是默认查询的字段是createdAt和数据库的小写字段不匹配，建议手动添加
  }
);
// 角色
const Role = sequelize.define(
  "Role",
  {
    id: {
      type: DataTypes.BIGINT,
      comment: "ID",
      autoIncrement: true, //自增
      primaryKey: true, //主键
    },
    created_at: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: "创建时间",
      defaultValue: new Date().toLocaleString(), //如果没有设置该字段的值则使用默认
    },
    updated_at: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: "更新时间",
      defaultValue: new Date().toLocaleString(),
    },
    name: {
      type: DataTypes.STRING(20),
      allowNull: true,
      comment: "角色名",
    },
    label: {
      type: DataTypes.STRING(50),
      allowNull: true,
      comment: "角色描述",
    },
    is_disable: {
      type: DataTypes.TINYINT,
      comment: "是否禁用(0:否 1:是)",
      defaultValue: 0,
    },
  },
  {
    tableName: "role",
    timestamps: false,
  }
);
// 资源(接口)
const Resource = sequelize.define(
  "Resource",
  {
    id: {
      type: DataTypes.BIGINT,
      comment: "ID",
      autoIncrement: true, //自增
      primaryKey: true, //主键
    },
    created_at: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: "创建时间",
      defaultValue: Sequelize.literal("CURRENT_TIMESTAMP"), //如果没有设置该字段的值则使用默认
    },
    updated_at: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: "更新时间",
      defaultValue: Sequelize.literal(
        "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
      ),
    },
    url: {
      type: DataTypes.STRING(255),
      allowNull: true,
      comment: "资源路径(接口URL)",
    },
    request_method: {
      type: DataTypes.STRING(10),
      allowNull: true,
      comment: "请求方式",
    },
    name: {
      type: DataTypes.STRING(50),
      allowNull: true,
      commit: "资源名（接口名）",
    },
    parent_id: {
      type: DataTypes.INTEGER,
      allowNull: true,
      commit: "父权限id",
    },
    is_anonymous: {
      type: DataTypes.INTEGER,
      allowNull: true,
      commit: "是否匿名访问（0-否 1-是）",
    },
  },
  { tableName: "resource", timestamps: false }
);
// 角色-资源 关联
const RoleResource = sequelize.define(
  "RoleResource",
  {
    role_id: {
      type: DataTypes.INTEGER,
      primaryKey: true, // 将role_id作为主键
      autoIncrement: false, // 禁用自增
    },
    resource_id: {
      type: DataTypes.INTEGER,
      primaryKey: true, // 将role_id作为主键
      autoIncrement: false, // 禁用自增
    },
  },
  {
    tableName: "role_resource",
    timestamps: false,
  }
);

// 用户-角色 关联
const UserRole = sequelize.define(
  "UserRole",
  {
    user_id: {
      type: DataTypes.INTEGER,
      allowNull: true,
      commit: "用户ID",
      primaryKey: true,
    },
    role_id: {
      type: DataTypes.INTEGER,
      allowNull: true,
      commit: "角色ID",
      primaryKey: true,
    },
  },
  {
    tableName: "user_role",
    timestamps: false,
  }
);

// 菜单
const Menu = sequelize.define(
  "Menu",
  {
    id: {
      type: DataTypes.BIGINT,
      comment: "ID",
      autoIncrement: true, //自增
      primaryKey: true, //主键
    },
    created_at: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: "创建时间",
      defaultValue: Sequelize.literal("CURRENT_TIMESTAMP"), //如果没有设置该字段的值则使用默认
    },
    updated_at: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: "更新时间",
      defaultValue: Sequelize.literal(
        "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
      ),
    },
    name: {
      type: DataTypes.STRING(20),

      comment: "菜单名",
    },
    path: {
      type: DataTypes.STRING(50),

      comment: "菜单路径",
    },
    component: {
      type: DataTypes.STRING(50),

      comment: "组件",
    },
    icon: {
      type: DataTypes.STRING(50),

      comment: "菜单图标",
    },
    parent_id: {
      type: DataTypes.INTEGER,
      comment: "父菜单id",
    },
    order_num: {
      type: DataTypes.TINYINT,
      defaultValue: 0,
      comment: "显示排序",
    },
    is_hidden: {
      type: DataTypes.TINYINT,
      defaultValue: 0,
      comment: "是否隐藏(0-否 1-是)",
    },
    keep_alive: {
      type: DataTypes.TINYINT,
      defaultValue: 1,
    },
    redirect: {
      type: DataTypes.STRING(50),
      comment: "跳转路径",
    },
  },
  { tableName: "menu", timestamps: false }
);
// 角色-菜单 关联
const RoleMenu = sequelize.define(
  "RoleMenu",
  {
    role_id: {
      type: DataTypes.INTEGER,
      primaryKey: true, // 将role_id作为主键
      autoIncrement: false, // 禁用自增
    },
    menu_id: {
      type: DataTypes.INTEGER,
      primaryKey: true, // 将role_id作为主键
      autoIncrement: false, // 禁用自增
    },
  },
  {
    tableName: "role_menu",
    timestamps: false,
  }
);

module.exports = {
  Role,
  UserAuth,
  Resource,
  RoleResource,
  UserRole,
  Menu,
  RoleMenu,
};
